home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Reference Guide / C-C++ Interactive Reference Guide.iso / c_ref / csource5 / 309_01 / cc3.c < prev    next >
Text File  |  1990-03-20  |  9KB  |  452 lines

  1. /*
  2. HEADER:        Small-C source part 3;
  3. FILENAME:    CC3.C;
  4. AUTHORS:    Dieter H. Flunkert;
  5. COMPILERS:Turbo C V2.0 Medium Memory Model;
  6. SYSTEM: MSDOS (Brian Brown Nov 1989)
  7. */
  8.  
  9. #include <stdio.h>
  10. #include "ccdef.c"
  11.  
  12. /* define external functions */
  13. extern int astreq(), blanks(), call(), callstk(), cnl(), comment(), cout(),
  14.   errrpt(), expression(), findmac(), immed(), match(), modstk(), nl(),
  15.   outdec(), outstr(), preprocess(), push(), sout(), streq(), swapstk();
  16.  
  17. /* external variables */
  18. extern int cmode, ctext, eof, iflevel, input, input2, lptr, nxtlab,
  19.   output, skiplevel, stkp, wq[wqtabsz], *wqptr, asmtype;
  20.  
  21. extern char *cptr, *endsearch, *glbptr, line[linesize], *locptr,
  22.   *startcomp, *statptr, stattab[stattbsize], symtab[symsiz];
  23.  
  24. /* Perform a function call, called from heir11, this routine will either call
  25.    the named function, or if the supplied ptr is zero, will call the contents
  26.    of HL  */
  27. callfunction(ptr)
  28. char *ptr; /* symbol table entry (or 0) */
  29. {
  30.  int nargs;
  31.  nargs=0;
  32.  blanks(); /* already saw open paren */
  33.  if(ptr==0)push(); /* calling HL */
  34.  while(streq(line+lptr,")")==0)
  35.   {if(endst())break;
  36.   expression(); /* get an argument */
  37.   if(ptr==0)swapstk(); /* don't push addr */
  38.   push(); /* push argument */
  39.   nargs=nargs+2; /* count args*2 */
  40.   if (match(",")==0) break;
  41.   }
  42.  needbrack(")");
  43.  if(streq(ptr,"printf")) {
  44.    immed();     /* argument counter in primary register */
  45.    outdec(nargs>>1);     /*  for printf etc. */
  46.    nl();                 /*  Dieter H. Flunkert     20-jul-86  */
  47.  }
  48.  if(ptr)call(ptr);
  49.  else callstk();
  50.  stkp=modstk(stkp+nargs); /* clean up arguments */
  51. }
  52.  
  53. junk()
  54. { if(an(inbyte()))
  55.   while(an(ch()))gch();
  56.  else while(an(ch())==0)
  57.   {if(ch()==0)break;
  58.   gch();
  59.   }
  60.  blanks();
  61. }
  62.  
  63. endst()
  64. { blanks();
  65.  return ((streq(line+lptr,";")|(ch()==0)));
  66. }
  67.  
  68. illname()
  69. { errrpt("illegal symbol name");junk();}
  70.  
  71. multidef(sname)
  72. char *sname;
  73. { errrpt("already defined");
  74.  comment();
  75.  outstr(sname);nl();
  76. }
  77.  
  78. needbrack(str)
  79. char *str;
  80. { if (match(str)==0)
  81.   {errrpt("missing token");
  82.   comment();outstr(str);nl();
  83.   }
  84. }
  85.  
  86. needlval()
  87. { errrpt("must be lvalue");
  88. }
  89.  
  90. hash(sname)
  91. char *sname;
  92. {
  93.   int h, c;
  94.   h = *sname;
  95.   while(c = *(++sname)) h=(h<<1)+c;
  96.   return h;
  97. }
  98.  
  99. /* find local static variable ** dhf 29-oct-86 */
  100. findstat(sname)
  101. char *sname;
  102. {
  103.   char *ptr;
  104.   ptr = statptr;
  105.   while( ptr >= startstat) {
  106.     ptr = ptr - statsize;
  107.     if( astreq(sname, ptr, namemax)) return ptr;
  108.   }
  109.   return 0;
  110. }
  111.  
  112. findglb(sname)
  113. char *sname;
  114. {
  115.   int h;
  116.   h=hash(sname) & MASKGLBS;
  117.   cptr = startglb+h*symsiz;
  118.   while(astreq( sname, cptr, namemax) == 0) {
  119.     if( *cptr == 0) return 0;
  120.     cptr = cptr+symsiz;
  121.     if(cptr >= endglb) cptr=startglb;
  122.  }
  123.  return cptr;
  124. }
  125.  
  126. /* find local,  search from end to start of local pointer storage area*/
  127. findloc(sname)
  128. char *sname;
  129. {
  130.   char *ptr;
  131.   ptr=locptr;
  132.   while(ptr > endsearch)
  133.   {
  134.     ptr=ptr-symsiz;
  135.     if( astreq(sname,ptr,namemax)) return (ptr);
  136.   }
  137.   return (0);
  138. }
  139.  
  140. /* add local static variable ** dhf 29-oct-86 */
  141. addstatic(sname, numlab, id, typ, value)
  142. char *sname, *numlab, id, typ;
  143. int value;
  144. {
  145.   char *ptr;
  146.   endsearch = startcomp;
  147.   if( findloc(sname) ) return statptr;
  148.   endsearch = startloc;
  149.   if(statptr >= endstat) {
  150.    errrpt("static symbol table overflow");
  151.    return 0;
  152.   }
  153.   ptr = statptr;
  154.   while( an(*ptr++ = *sname++)) ; /* copy name */
  155.   ptr = statptr + symsiz;
  156.   while(an(*ptr++ = *numlab++)) ;  /* copy local label */
  157.   statptr[ident] = id;
  158.   statptr[type] = typ;
  159.   statptr[storage] = statik;
  160.   putint(value, statptr+offset, offsize);
  161.   statptr = statptr + statsize;
  162.   return statptr;
  163. }
  164.  
  165. addglb(sname,id,typ,value,class)
  166. char *sname,id,typ;
  167. int value,class;
  168. {
  169.   char *ptr;
  170.   if(findglb(sname)) return (cptr);
  171.   if(glbptr>=endglb)
  172.   {
  173.     errrpt("global symbol table overflow");
  174.     return (0);
  175.   }
  176.   ptr=cptr;
  177.   while(an(*ptr++ = *sname++)); /* copy name */
  178.   cptr[ident]=id;
  179.   cptr[type]=typ;
  180.   cptr[storage]=class;
  181.   putint(value, cptr+offset, offsize);
  182.   glbptr=glbptr+symsiz;
  183.   return (cptr);
  184. }
  185.  
  186. addloc(sname,id,typ,value)
  187. char *sname,id,typ;
  188. int value;
  189. {
  190.   char *ptr;
  191.   endsearch=startcomp;
  192.   if(findloc(sname)) return statptr;
  193.   endsearch=startloc;
  194.   if(locptr>=endloc)
  195.   {
  196.     errrpt("local symbol table overflow");
  197.     return (0);
  198.   }
  199.   cptr=ptr=locptr;
  200.   while(an(*ptr++ = *sname++)); /* copy name */
  201.  
  202. /* next lines added for 6809 from dieter flunkert 22 jan 1986 */
  203. /* value has to be adjusted for cchar type varibles. 6809 handles */
  204. /* the values on the stack high/low not /low/high like the 8080 and z80 */
  205.  
  206.  if((id==variable)&&(typ==cchar)) --value;
  207. /* end of modification 22 jan 1986 */
  208.  cptr[ident]=id;
  209.  cptr[type]=typ;
  210.  cptr[storage]=stkloc;
  211.  putint(value, cptr+offset, offsize);
  212.  locptr=locptr+symsiz;
  213.  return (cptr);
  214. }
  215.  
  216. #ifdef STGOTO
  217. #ifndef HASH
  218. nextsym(entry) char *entry; {
  219.   entry = entry + name;
  220.   while(*entry++ >= ' ');  /* find length byte */
  221.   return entry;
  222. }
  223. #endif
  224. #endif
  225.  
  226. /*get integer of len from addr (byte sequence set by "putint"*/
  227. getint(addr,len)
  228. char *addr;
  229. int len;
  230. {
  231.   int i;
  232.   i = *(addr + --len);  /* high order byte sign extend */
  233.   while(len--) i = (i << 8) | *(addr+len)&255;
  234.   return(i);
  235. }
  236.  
  237. /*  put integer i of length len into address addr (low byte first) */
  238. putint(i, addr, len)
  239. char *addr;
  240. int i, len;
  241. {
  242.   while(len--) {
  243.     *addr++ = i;
  244.     i = i>>8;
  245.   }
  246. }
  247.  
  248. /* Test if next input string is legal symbol name */
  249. symname(sname)
  250. char *sname;
  251. {
  252.  blanks();
  253.  if(alpha(ch())==0) return (0);
  254.  while(an(ch()))*sname++=gch();
  255.  *sname=0;
  256.  return (1);
  257.  }
  258.  
  259. /* Return next avail internal label number */
  260. getlabel()
  261. {
  262.   return(++nxtlab);
  263. }
  264.  
  265. /*  print label with newline */
  266. postlabel(label)
  267. int label;
  268. {
  269.   outstr("cc"); outdec(label);  nl();
  270. }
  271.  
  272. /*  print label with colon */
  273. prelabel(label)
  274. int label;
  275. {
  276.   outstr("cc"); outdec(label); outstr(":  "); nl();
  277. }
  278.  
  279. /* Print specified number as label */
  280. printlabel(label)
  281. int label;
  282. {
  283.   outstr("cc");  outdec(label);
  284. }
  285.  
  286. /* Test if given character is alpha */
  287. alpha(c)
  288.  char c;
  289. { c=c&127;
  290.  if(c>='a') return(c<='z');
  291.  if(c<='Z') return(c>='A');
  292.  return(c=='_');
  293. }
  294.  
  295. /* Test if given character is numeric */
  296. numeric(c)
  297. char c;
  298. {
  299.   c=c&127; if(c>='0') return(c<='9'); return 0;
  300. }
  301.  
  302. /* Test if given character is alphanumeric */
  303. an(c)
  304. char c;
  305. {
  306.   if(alpha(c)) return 1;
  307.   return(numeric(c));
  308. }
  309.  
  310. /* Print a new line and a string only to console */
  311. pl(str)
  312. char *str;
  313. {
  314.   cnl();
  315.   while(*str) putchar(*str++);
  316. }
  317.  
  318. addwhile(ptr)
  319.  int ptr[];
  320.  {
  321.  int k;
  322.  ptr[wqsp]=stkp;  /* and stk ptr */
  323.  ptr[wqloop]=getlabel(); /* and looping label */
  324.  ptr[wqlab]=getlabel(); /* and exit label */
  325.  if (wqptr==wqmax)
  326.   {errrpt("too many active whiles");exit(ERRCODE);}
  327.  k=0;
  328.  while (k<wqsiz)
  329.   {*wqptr++ = ptr[k++];}
  330. }
  331.  
  332. delwhile()
  333. {
  334.   if(readwhile()) wqptr=wqptr-wqsiz;
  335. }
  336.  
  337. readwhile()
  338. {
  339.  if (wqptr==wq){errrpt("no active whiles");return (0);}
  340.  else return (wqptr-wqsiz);
  341. }
  342.  
  343. ch()
  344. {
  345.   return(line[lptr]&127);
  346. }
  347.  
  348. nch()
  349. {
  350.   if(ch())return(line[lptr+1]&127);
  351.   return 0;
  352. }
  353.  
  354. gch()
  355. {
  356.   if(ch()) return(line[lptr++]&127);
  357.   return 0;
  358. }
  359.  
  360. kill()
  361. {
  362.   lptr=0;
  363.   line[lptr]=0;
  364. }
  365.  
  366. inbyte()
  367. {
  368.   while(ch()==0)
  369.   {
  370.      inline();
  371.      if (eof) return (0);
  372.      preprocess();
  373.   }
  374.   return (gch());
  375. }
  376.  
  377. inchar()
  378. {
  379.  if(ch()==0)inline();
  380.  if(eof)return (0);
  381.  return(gch());
  382. }
  383.  
  384. inline()
  385. {
  386.   int k;
  387.   FILE *unit;
  388.   while(1)
  389.   {
  390.     if (input==0)
  391.     eof=YES;
  392.     if(eof)return;
  393.     if((unit=input2)==0)unit=input;
  394.     kill();
  395.     while((k=getc(unit))>0)
  396.     {
  397.        if((k==EOL)||(lptr>=linemax))break;
  398.        line[lptr++]=k;
  399.     }
  400.     line[lptr]=0; /* append null */
  401.     if(k<=0)
  402.     {
  403.        fclose(unit);
  404.        if(input2)input2=0;
  405.        else input=0;
  406.     }
  407.     if(lptr)
  408.     {
  409.       if((ctext)&&(cmode))
  410.       {
  411.         if( asmtype == AS9) cout('*', output); else cout(';', output);
  412.         cout(' ', output);
  413.         sout(line,output);
  414.         cout('\n',output);
  415.       }
  416.       lptr=0;
  417.       if(match("#ifdef")) {
  418.         ++iflevel;
  419.         if(skiplevel) continue;
  420.         blanks();
  421.         if(findmac(&line[lptr])==0) skiplevel=iflevel;
  422.         continue;
  423.       }
  424.       if(match("#ifndef")) {
  425.          ++iflevel;
  426.          if(skiplevel) continue;
  427.          blanks();
  428.          if(findmac(&line[lptr]))  skiplevel=iflevel;
  429.          continue;
  430.       }
  431.       if(match("#else")) {
  432.          if(iflevel) {
  433.       if(skiplevel==iflevel) skiplevel=0;
  434.       else if(skiplevel==0) skiplevel=iflevel;
  435.          }
  436.          else errrpt("no matching #if...");
  437.          continue;
  438.       }
  439.      if(match("#endif")) {
  440.         if(iflevel) {
  441.      if(skiplevel==iflevel) skiplevel=0;
  442.       --iflevel;
  443.          }
  444.          else errrpt("no matching #if...");
  445.          continue;
  446.       }
  447.       if(skiplevel) continue;
  448.       break;
  449.     }
  450.   }
  451. }
  452.